class BlogPost < ActiveRecord::Base
  attr_accessible :published, :text, :topic_id, :user_id
  belongs_to :user
  belongs_to :topic
  validates :text, :presence => true
  scope :published, where(:published => true)
  # Для вывода ленты последних записок во всех топиках, видимые анонимным пользователям.
  scope :public_visible, published.joins(:topic).where('topics.public' => true)

  BRIEF_LENGTH = 25

  def self.in_topic(topic)
    where(:topic_id => topic.id)
  end

  # Для вывода записок, видимых пользователю, включает неопубликованные пользователем посты и топики
  def self.visible_to(user)
    # Посты, принадлежащие пользователю ИЛИ опубликованные в публичных, опубликованных топиках
    joins(:topic).where("blog_posts.user_id = #{user.id} OR (topics.public = true AND topics.published = true AND blog_posts.published = true)")
  end

  # Для вывода постов в конкретном топике, видимых конкретному пользователю.
  # Не показывает неопубликованные посты других юзеров, показывает все посты данного пользователя.
  # Для безопасности не показывает посты из непубличных топиков
  def self.visible_in_topic_to(topic, user)
    return [] if topic.public == false && topic.user != user
    where(:topic_id => topic.id).where("user_id = #{user.id} OR published = true")
  end

  def brief_text
    text_chars = text.split("")
    return "#{text_chars[0,BRIEF_LENGTH - 3]}..." if text_chars.count > BRIEF_LENGTH
    text
  end

  def allowed_to?(user)
    return true if self.user == user
    return false unless published
    return false if topic.user != user and topic.public == false
    true
  end

  def created
    DateFuncs::datetime(created_at)
  end

  def updated
    DateFuncs::datetime(updated_at)
  end
end
